/*******************************************************************************
* Copyright (C), 2014-2015, www.njodin.com
*
* 文件名: OD_DebugPrint.c
* 内容简述: 调试信息的打印
*
* 文件历史:
* 版本号    日期      作者      说明
* v0.1    2014.5.20   candy     创建文件
* 
*******************************************************************************/
#include "OD_DebugPrint.h"
#include "OD_SystemTick.h"
#include "global.h"
#include "OD_SimulateUart.h"
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>

/* 定义打印信息开关 */
static DebugState_Str DebugState = { OFF, OFF, OFF, OFF };

/*******************************************************************************
*  函数名： DebugPrint
*  输  入:  level：调试等级，format：变参函数参数
*  输  出:  无
*  功能说明： 自定义调试打印函数
*******************************************************************************/
void DebugPrint(DebugLevel_Enu level, char *format, ...)
{
  uint8 len;
  char *buf = NULL;    /* 打印缓冲区指针 */
  va_list ap;          /* 定义变参函数 */

  if ((DebugState.Info == OFF) && (DebugState.Log == OFF) &&
    (DebugState.Warning == OFF) && (DebugState.Error == OFF))
  {
    return;
  }

  va_start(ap, format);

  /* 为打印缓冲区分配内存 */
  buf = (char *) malloc(DEBUG_MAX_LEN);
  if (buf == NULL)
  {
    printf("Debug information function memory malloc error\r\n");
    while (1);
  }

  if ((DebugState.Info == ON) && (level == DEBUG_LEVEL_INFO))
  {
    strcpy((char *)buf, "[Info]:");
    len = strlen((char *)buf);
    vsnprintf((char *)buf + len, DEBUG_MAX_LEN - len, format, ap);
    OD_SimulateUartWriteData((uint8 *)buf, strlen(buf));
  }
  else if ((DebugState.Log == ON) && (level == DEBUG_LEVEL_LOG))
  {
    strcpy((char *)buf, "[Log]:");
    len = strlen((char *)buf);
    vsnprintf((char *)buf + len, DEBUG_MAX_LEN - len, format, ap);
    OD_SimulateUartWriteData((uint8 *)buf, strlen(buf));
  }
  else if ((DebugState.Warning == ON) && (level == DEBUG_LEVEL_WARNING))
  {
    strcpy((char *)buf, "[Warning]:");
    len = strlen((char *)buf);
    vsnprintf((char *)buf + len, DEBUG_MAX_LEN - len, format, ap);
    OD_SimulateUartWriteData((uint8 *)buf, strlen(buf));
  }
  else if ((DebugState.Error == ON) && (level == DEBUG_LEVEL_ERROR))
  {
    strcpy((char *)buf, "[Error]:");
    len = strlen((char *)buf);
    vsnprintf((char *)buf + len, DEBUG_MAX_LEN - len, format, ap);
    OD_SimulateUartWriteData((uint8 *)buf, strlen(buf));
  }
  free(buf);
  va_end(ap);
}

/*******************************************************************************
*  函数名： DebugSetState
*  输  入:  level：调试等级，state：开关状态
*  输  出:  无
*  功能说明： 打印调试状态设置
*******************************************************************************/
void DebugSetState(DebugLevel_Enu level, OnOffState_Enu state)
{
  if (level == DEBUG_LEVEL_INFO)
  {
    DebugState.Info = state;
  }
  else if (level == DEBUG_LEVEL_LOG)
  {
    DebugState.Log = state;
  }
  else if (level == DEBUG_LEVEL_WARNING)
  {
    DebugState.Warning = state;
  }
  else if (level == DEBUG_LEVEL_ERROR)
  {
    DebugState.Error = state;
  }
}

/* 获取打印调试的状态 */
/*******************************************************************************
*  函数名： DebugGetState
*  输  入:  level：调试等级
*  输  出:  获取开关状态
*  功能说明： 获取打印调试的状态
*******************************************************************************/
OnOffState_Enu DebugGetState(DebugLevel_Enu level)
{

  if (level == DEBUG_LEVEL_INFO)
  {
    return DebugState.Info;
  }
  else if (level == DEBUG_LEVEL_LOG)
  {
    return DebugState.Log;
  }
  else if (level == DEBUG_LEVEL_WARNING)
  {
    return DebugState.Warning;
  }
  else if (level == DEBUG_LEVEL_ERROR)
  {
    return DebugState.Error;
  }

  return ON;          /* 程序跑不到此处 */
}

/*******************************************************************************
*  函数名： OD_DebugPrintInit
*  输  入:  无
*  输  出:  无
*  功能说明： 打印信息的初始化
*******************************************************************************/
void OD_DebugPrintInit(void)
{
  DebugSetState(DEBUG_LEVEL_LOG, ON);
  DebugSetState(DEBUG_LEVEL_INFO, ON);
  DebugSetState(DEBUG_LEVEL_WARNING, ON);
  DebugSetState(DEBUG_LEVEL_ERROR, ON);
}

/*******************************************************************************
*  函数名： OD_Assertion
*  输  入:  无
*  输  出:  无
*  功能说明： 断言指示标志
*******************************************************************************/
void OD_Assertion(void)
{
  while(1)
  {

  }
}
